render: Only render 4 different arrows
authorBenjamin Otte <otte@redhat.com>
Mon, 19 Jan 2015 04:44:47 +0000 (05:44 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 20 Jan 2015 05:30:19 +0000 (06:30 +0100)
Instead of supporting every angle, just support top, right, bottom and
left and round the angle to one of those directions.

Adwaita overrides arrows anyway and doesn't even look at the angle, so
this should not be a problem.

gtk/gtkcssimagebuiltin.c
gtk/gtkcssimagebuiltinprivate.h
gtk/gtkrender.c

index 1ce28e2117bb011cad1ef50ff0602ea8a18ee91a..b80f5686fe2f46c8ebd618c9713a92bef08578b3 100644 (file)
@@ -219,6 +219,7 @@ gtk_css_image_builtin_draw_arrow (GtkCssImage            *image,
                                   cairo_t                *cr,
                                   double                  width,
                                   double                  height,
+                                  GtkCssImageBuiltinType  image_type,
                                   const GdkRGBA *         color)
 {
   double line_width;
@@ -226,7 +227,25 @@ gtk_css_image_builtin_draw_arrow (GtkCssImage            *image,
 
   size = MIN (width, height);
 
-  cairo_translate (cr, width / 2.0 + size / 4.0, height / 2.0);
+  cairo_translate (cr, width / 2.0, height / 2.0);
+  switch (image_type)
+  {
+    case GTK_CSS_IMAGE_BUILTIN_ARROW_UP:
+      break;
+    case GTK_CSS_IMAGE_BUILTIN_ARROW_DOWN:
+      cairo_rotate (cr, G_PI);
+      break;
+    case GTK_CSS_IMAGE_BUILTIN_ARROW_LEFT:
+      cairo_rotate (cr, 3 * G_PI / 2);
+      break;
+    case GTK_CSS_IMAGE_BUILTIN_ARROW_RIGHT:
+      cairo_rotate (cr, G_PI / 2);
+      break;
+    default:
+      g_assert_not_reached ();
+      break;
+  }
+  cairo_translate (cr, size / 4.0, 0);
 
   line_width = size / 3.0 / sqrt (2);
   cairo_set_line_width (cr, line_width);
@@ -867,9 +886,13 @@ gtk_css_image_builtin_draw (GtkCssImage            *image,
                                        fg_color, bg_color,
                                        border_color, border_width);
     break;
-  case GTK_CSS_IMAGE_BUILTIN_ARROW:
+  case GTK_CSS_IMAGE_BUILTIN_ARROW_UP:
+  case GTK_CSS_IMAGE_BUILTIN_ARROW_DOWN:
+  case GTK_CSS_IMAGE_BUILTIN_ARROW_LEFT:
+  case GTK_CSS_IMAGE_BUILTIN_ARROW_RIGHT:
     gtk_css_image_builtin_draw_arrow (image, cr,
                                       width, height,
+                                      image_type,
                                       fg_color);
     break;
   case GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_LEFT:
index 3f11a79915207dbf1ed6402c7a6be11b16c71203..082a6e3111cc441102d5fb704320b06f2e3ce623 100644 (file)
@@ -33,7 +33,10 @@ typedef enum {
   GTK_CSS_IMAGE_BUILTIN_OPTION,
   GTK_CSS_IMAGE_BUILTIN_OPTION_CHECKED,
   GTK_CSS_IMAGE_BUILTIN_OPTION_INCONSISTENT,
-  GTK_CSS_IMAGE_BUILTIN_ARROW,
+  GTK_CSS_IMAGE_BUILTIN_ARROW_UP,
+  GTK_CSS_IMAGE_BUILTIN_ARROW_DOWN,
+  GTK_CSS_IMAGE_BUILTIN_ARROW_LEFT,
+  GTK_CSS_IMAGE_BUILTIN_ARROW_RIGHT,
   GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_LEFT,
   GTK_CSS_IMAGE_BUILTIN_EXPANDER_VERTICAL_LEFT,
   GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_RIGHT,
index 542c4670e2a4f09bb51ef873af6ccd9fe172c642..54bc41003627eedb1239f5158654c91d88513406 100644 (file)
@@ -287,8 +287,32 @@ gtk_do_render_arrow (GtkStyleContext *context,
                      gdouble          size)
 {
   GtkBorderStyle border_style;
+  GtkCssImageBuiltinType image_type;
   gint border_width;
 
+  /* map [0, 2 * pi) to [0, 4) */
+  angle = round (2 * angle / G_PI);
+
+  switch (((int) angle) & 3)
+  {
+  case 0:
+    image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_UP;
+    break;
+  case 1:
+    image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_RIGHT;
+    break;
+  case 2:
+    image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_DOWN;
+    break;
+  case 3:
+    image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_LEFT;
+    break;
+  default:
+    g_assert_not_reached ();
+    image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_UP;
+    break;
+  }
+
   if (render_icon_image (context, cr, x, y, size, size))
     return;
 
@@ -310,14 +334,12 @@ gtk_do_render_arrow (GtkStyleContext *context,
       border_width = 0;
     }
 
-  cairo_translate (cr, x + size / 2.0, y + size / 2.0);
-  cairo_rotate (cr, angle - G_PI_2);
-  cairo_translate (cr, - size / 2.0, - size / 2.0);
+  cairo_translate (cr, x, y);
 
   gtk_css_image_builtin_draw (_gtk_css_image_value_get_image (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_ICON_SOURCE)),
                               cr,
                               size, size,
-                              GTK_CSS_IMAGE_BUILTIN_ARROW,
+                              image_type,
                               _gtk_css_rgba_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR)),
                               _gtk_css_rgba_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BACKGROUND_COLOR)),
                               _gtk_css_rgba_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_TOP_COLOR)),